package com.genreate.util;

import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.RandomUtil;

import java.util.*;

/**
 * 随机昵称生成器
 *
 * @author LYS
 * @date 2025-05-20
 */
public class RandomNicknameGenerator {

    /**
     * 基础词库 - 可根据需要扩展
     */
    private static final Map<String, List<String>> WORD_LIBRARIES = new HashMap<>();
    private static final Map<String, String[]> STYLE_FORMATS = new HashMap<>();
    private static final Random RANDOM = new Random();

    static {
        // 初始化各类词库
        initWordLibraries();
        // 初始化风格模板
        initStyleFormats();
    }

    private static void initWordLibraries() {
        // 自然元素
        WORD_LIBRARIES.put("nature", Arrays.asList(
                "云", "风", "雨", "雪", "雷", "电", "山", "水", "海", "湖", "河", "溪",
                "花", "草", "树", "木", "林", "叶", "枝", "根", "芽", "果", "瓜", "藤",
                "日", "月", "星", "辰", "天", "空", "霞", "雾", "霜", "露", "虹", "光"
        ));

        // 动物名称
        WORD_LIBRARIES.put("animal", Arrays.asList(
                "猫", "狗", "兔", "鸟", "鱼", "龙", "虎", "豹", "狮", "狼", "熊", "鹿",
                "马", "牛", "羊", "鸡", "鸭", "鹅", "蛇", "蛙", "蝶", "蜂", "蝉", "虾"
        ));

        // 形容词 - 通用
        WORD_LIBRARIES.put("adj_common", Arrays.asList(
                "孤独", "自由", "快乐", "悲伤", "宁静", "喧嚣", "温暖", "寒冷", "明亮",
                "黑暗", "高大", "矮小", "美丽", "丑陋", "优雅", "笨拙", "勇敢", "懦弱",
                "聪明", "愚蠢", "善良", "邪恶", "热情", "冷漠", "温柔", "暴躁", "坚强"
        ));

        // 形容词 - 古风
        WORD_LIBRARIES.put("adj_ancient", Arrays.asList(
                "清", "淡", "幽", "雅", "孤", "傲", "冷", "寂", "轩", "昂", "潇", "洒",
                "悠", "然", "飘", "逸", "灵", "秀", "俊", "美", "娴", "静", "沉", "稳",
                "豪", "放", "旷", "达", "谦", "逊", "高", "洁", "纯", "真", "深", "远"
        ));

        // 动词
        WORD_LIBRARIES.put("verb", Arrays.asList(
                "飞", "舞", "歌", "吟", "笑", "哭", "跑", "跳", "走", "停", "坐", "卧",
                "看", "听", "闻", "尝", "思", "想", "梦", "追", "逐", "望", "等", "待"
        ));

        // 物品
        WORD_LIBRARIES.put("item", Arrays.asList(
                "剑", "琴", "书", "画", "笔", "墨", "纸", "砚", "茶", "酒", "杯", "盏",
                "衣", "帽", "鞋", "袜", "伞", "扇", "灯", "烛", "铃", "钟", "锁", "钥"
        ));

        // 情感
        WORD_LIBRARIES.put("emotion", Arrays.asList(
                "思念", "眷恋", "牵挂", "期待", "失望", "绝望", "欢喜", "愉悦", "满足",
                "寂寞", "孤独", "无聊", "愤怒", "悲伤", "痛苦", "甜蜜", "幸福", "感动"
        ));

        // 数字
        WORD_LIBRARIES.put("number", Arrays.asList(
                "一", "二", "三", "四", "五", "六", "七", "八", "九", "十",
                "百", "千", "万", "亿", "零", "半", "双", "独", "众", "群"
        ));

        // 符号装饰
        WORD_LIBRARIES.put("symbol", Arrays.asList(
                "°", "•", "♪", "♫", "★", "☆", "✦", "✧", "✿", "❀", "♥", "♡",
                "๑", "۩", "۞", "☽", "☾", "❥", "❦", "❧", "✄", "☯", "☭", "☢"
        ));
    }

    private static void initStyleFormats() {
        // 风格模板定义 - 使用占位符 {nature} {animal} 等表示从对应词库取词
        STYLE_FORMATS.put("清新自然", new String[]{
                "{nature}{nature}",            // 云淡、风轻
                "{nature}{verb}{nature}",      // 花落、风起
                "{adj_common}{nature}",        // 孤云、冷月
                "{nature}{symbol}{nature}"     // 花•影、风°铃
        });

        STYLE_FORMATS.put("霸气侧漏", new String[]{
                "{verb}{animal}",              // 屠龙、战狼
                "{adj_common}{animal}",        // 狂狮、傲虎
                "{animal}{verb}{item}",        // 龙傲剑、虎啸刀
                "{adj_common}{adj_common}{animal}" // 狂傲龙、霸气虎
        });

        STYLE_FORMATS.put("可爱萌趣", new String[]{
                "{animal}{animal}",            // 喵喵、兔兔
                "{adj_common}{animal}",        // 小奶猫、软糖兔
                "{nature}{symbol}{animal}",    // 草莓♡兔、云朵☁猫
                "{number}{animal}{nature}"     // 三花猫、九尾狐
        });

        STYLE_FORMATS.put("文艺清新", new String[]{
                "{adj_ancient}{nature}",       // 清荷、幽竹
                "{nature}{verb}{nature}",      // 月吟、风舞
                "{emotion}{nature}",           // 念雪、思雨
                "{adj_ancient}{item}"          // 古琴、墨笔
        });

        STYLE_FORMATS.put("神秘莫测", new String[]{
                "{adj_common}{nature}",        // 暗月、幽冥
                "{nature}{symbol}{nature}",    // 星✦辰、雾☠影
                "{adj_common}{verb}{nature}",  // 幻行风、断水流
                "{adj_common}{animal}{nature}" // 暗夜狼、血色蝶
        });
    }

    /**
     * 生成随机网名
     *
     * @param style 风格类型
     * @return 生成的网名
     */
    public static String generate(String style) {
        // 检查风格是否存在
        if (!STYLE_FORMATS.containsKey(style)) {
            throw new IllegalArgumentException("不支持的风格类型: " + style);
        }

        // 随机选择一个格式模板
        String[] formats = STYLE_FORMATS.get(style);
        String format = formats[RANDOM.nextInt(formats.length)];

        // 解析模板并替换占位符
        StringBuilder result = new StringBuilder();
        String[] parts = format.split("\\}");

        for (String part : parts) {
            if (part.isEmpty()) continue;

            String[] placeholder = part.split("\\{");
            if (placeholder.length == 2) {
                String libraryType = placeholder[1];
                // 从对应词库随机选择一个词
                String word = getRandomWord(libraryType);
                result.append(word);
            } else {
                result.append(part);
            }
        }

        return result.toString();
    }

    /**
     * 从指定词库中随机获取一个词
     *
     * @param libraryType 词库类型
     * @return 随机词
     */
    private static String getRandomWord(String libraryType) {
        List<String> library = WORD_LIBRARIES.getOrDefault(libraryType, Collections.emptyList());
        if (library.isEmpty()) {
            return "未知";
        }
        return library.get(RANDOM.nextInt(library.size()));
    }

    /**
     * 生成多个随机网名
     *
     * @param style 风格类型
     * @param count 生成数量
     * @return 网名列表
     */
    public static List<String> generateMultiple(String style, int count) {
        List<String> result = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            result.add(generate(style));
        }
        return result;
    }

    /**
     * 获取所有支持的风格列表
     *
     * @return 风格列表
     */
    public static List<String> getSupportedStyles() {
        return new ArrayList<>(STYLE_FORMATS.keySet());
    }

    /**
     * 随机生成一个网名
     *
     * @return {@link String }
     */
    public static String generatorOne(){
        List<String> nicknames = generateMultiple(RandomUtil.randomEle(getSupportedStyles()), 1);
        return nicknames.get(0);
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(generatorOne());
        }
    }
}